package com.sgq.utils;

import com.sgq.entity.Permission;
import com.sgq.vo.RouterVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author: 83778
 * @date: 2024-09-19 10:57
 * @desc: 菜单树构建工具
 */
public class MenuTree {

    /**
     * 根据权限集合生成菜单树
     * （传入的数据已经过滤掉空permission和增删改查等权限（类型2）
     *  只保留类型 0 和类型 1 的）
     * @param menuList 权限列表（根据你自己的用户id查询出来）
     * @param pid 父id
     * @return
     */

    public static List<RouterVo> makeRouterTree(List<Permission> menuList, Long pid){
        //创建路由集合
        List<RouterVo> routerVoList = new ArrayList<>();
        //如果menuList不为空则使用menuList
        Optional.ofNullable(menuList)
                //如果menuList为空则使用空集合
                .orElse(new ArrayList<Permission>())
                //过滤出父级id为pid的权限
                // 过滤掉元素为空的permission
                // 0L  =>   parent_id = 0
                .stream().filter(item -> item != null && item.getParentId().equals(pid))
                //排序，使菜单按顺序显示
                .sorted(Comparator.comparing(Permission::getOrderNum))
                //遍历父id一样的权限
                .forEach(item ->{
                    //创建路由信息对象
                    RouterVo routerVo = new RouterVo();
                    //路由名称  => 系统管理
                    routerVo.setName(item.getName());
                    //路由地址 => /system
                    routerVo.setPath(item.getPath());
                    //如果你是一个顶级菜单 只要是等于0的就是顶级菜单
                    if (item.getParentId() == 0L){
                        //给你一个叫做 Layout 的组件 （默认的）
                        routerVo.setComponent("Layout");
                        //就让你一直显示
                        routerVo.setAlwaysShow(true);
                    }else {
                        routerVo.setComponent(item.getUrl());
                    }
                    //设置元数据
                    //标签Label =》 系统管理
                    //标签icon =》 图标
                    //code 权限集合
                    routerVo.setMeta(routerVo.new Meta(item.getLabel(), item.getIcon(),item.getCode().split(",")));
                    //设置子路由树                             原有的权限列表   当前数据id作为父id
                    List<RouterVo> children = makeRouterTree(menuList, item.getId());
                    routerVo.setChildren(children);
                    routerVoList.add(routerVo);
                });
        return routerVoList;
    }

    /**
     *
     * @param menuList
     * @param pid
     * @return
     */
    public static List<Permission> makeMenuTree(List<Permission> menuList , Long pid){
        //创建集合保存菜单数据
        List<Permission> permissionList = new ArrayList<Permission>();
        //判断菜单列表是否为空，如果不为空则使用菜单列表，否则创建集合对象
         Optional.ofNullable(menuList)
                .orElse(new ArrayList<Permission>())
                .stream()
                //先找到1级菜单
                .filter(item -> item != null && item.getParentId() == pid)
                .sorted(Comparator.comparing(Permission::getOrderNum))
                .forEach(item ->{
                    //创建权限菜单对象
                    Permission permission = new Permission();
                    //将原有的属性复制给菜单对象
                    BeanUtils.copyProperties(item , permission);
                    //获取每一个item对象的子菜单，递归生成菜单树
                    List<Permission> children = makeMenuTree(menuList,item.getId());
                    permission.setChildren(children);
                    //将菜单对象添加到集合
                    permissionList.add(permission);
                });
        //返回菜单信息
        return permissionList;
    }
}
